import { BasicAndQuoteType } from "../commonType";
import { basicBracketEnum, quoteBracketEnum } from "../enum";

// export type bracketBasicsType = `${basicBracketEnum}`;
// export type bracketQuotesType = `${quoteBracketEnum}`;

/**
 * 初始化括号实例时的基础信息对象参数
 */
export interface BracketInfoType extends Pick<BasicAndQuoteType, 'basic' | 'quote'> {
    basic: basicBracketEnum;
    quote: quoteBracketEnum;
}

/**
 * 括号实例的接口
 */
export interface BracketType extends Pick<BasicAndQuoteType, 'getBasic' | 'getQuote'> {
    action: Function | undefined;
    getBasic(): basicBracketEnum;
    getQuote(): quoteBracketEnum;
}

/**
 * 左括号实例接口，继承Bracket接口
 */
export interface BracketLeftType extends BracketType {
    readonly bracketName: basicBracketEnum.left
}

/**
 * 左括号实例接口，继承Bracket接口
 */
export interface BracketRightType extends BracketType {
    readonly bracketName: basicBracketEnum.right
}

/**
 * 记录左/右括号在当前中缀表达式中的位置索引，并提供修改方法
 */
export interface NumberStackType {
    /**
     * add：记录新加的括号所在式子的位置索引
     * @param index 新添加的括号所在位置
     */
    pushNewIndex(index: number): void;

    /**
     * remove：删除栈顶记录的括号位置索引
     * @returns 栈顶出栈的元素
     */
    popPeekIndex(): number | undefined;

    /**
     * initialize：清空所有已经保存的括号位置索引
     */
    clearAllIndex(): void;

    /**
     * count：获取已存括号索引个数
     * @returns 已存货号索引个数
     */
    countSize(): number;

    /**
     * indexOf:返回元素中小于等于某个值(targetIndex)的元素个数，用于找到数组内某个索引之前的左/右括号数量
     * @param targetIndex 目标索引
     * @returns 第一个比参数索引值大或等于的元素，前面元素个数
     */
    countBeforeItemOf(targetIndex: number): number;
}